package com.example.demo08rabbitmq;

import org.springframework.amqp.core.AmqpAdmin;
import org.springframework.amqp.rabbit.annotation.EnableRabbit;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration;
import org.springframework.amqp.rabbit.connection.CachingConnectionFactory;
import org.springframework.boot.autoconfigure.amqp.RabbitProperties;
import com.example.demo08rabbitmq.service.PersonService;

/**
 * 自动配置:
 *
 * @see RabbitAutoConfiguration
 * 1. 配置了 {@link CachingConnectionFactory} 连接工厂，连接工厂中配置了主机、端口、用户名、密码等;
 * (1) {@link RabbitProperties} 封装了主机、端口、用户名、密码等
 * 2. 配置了 {@link RabbitTemplate} 给 RabbitMQ 发送和接收消息
 * 3. 配置了 {@link AmqpAdmin} RabbitMQ 系统管理组件，用来声明队列和创建交换器 {@link Demo08RabbitmqApplicationTests#testAmqpAdmin()}
 * 4. @EnableRabbit + @RabbitListener 用来监听消息队列的内容 {@link PersonService}
 * <p>
 * 测试: {@link Demo08RabbitmqApplicationTests}
 * <p>
 * 5. 消息中间件 (为什么要使用消息中间件？？流量消峰、异步处理、系统解耦)
 * 如何保证消息的可靠性投递？ 定时任务 + 消息入库
 * 在保证了消息的可靠性投递的情况下，如何确保消费端的服务幂等性？？ Redis 分布式锁来解决
 * amq          --> 性能不好，容易产生消息堆积
 * rabbitmq     --> erlang 语言写的，最初应用在交换机上，性能还行
 * rockmq       --> 消息稳定，速度快，但是需要付费
 * kafaka       --> 容易丢失消息，只能做日志
 */
@EnableRabbit
@SpringBootApplication
public class Demo08RabbitmqApplication {

    public static void main(String[] args) {
        SpringApplication.run(Demo08RabbitmqApplication.class, args);
    }

}
